package ik.xcj.hostpital.manage.service.Impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import ik.xcj.hostpital.manage.ex.ServiceException;
import ik.xcj.hostpital.manage.mapper.IPatientMapper;
import ik.xcj.hostpital.manage.pojo.dto.PatientAddNewDTO;
import ik.xcj.hostpital.manage.pojo.vo.PatientListItemVO;
import ik.xcj.hostpital.manage.pojo.vo.PatientStandardVO;
import ik.xcj.hostpital.manage.service.IPatientService;
import ik.xcj.hostpital.manage.web.ServiceCode;
import ik.xcj.hostpital.manage.pojo.dto.PatientUpdateDTO;
import ik.xcj.hostpital.manage.pojo.entity.Patient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

/**
 * 处理就诊人数据的业务
 *
 * @author ik.xcj
 * @version 0.0.1
 */
@Slf4j
@Service
public class PatientServiceImpl implements IPatientService {

    @Autowired
    private IPatientMapper patientMapper;

    @Override
    public void addNew(PatientAddNewDTO patientAddNewDTO) {
        log.debug("开始处理【添加就诊人数据】的业务，参数：{}", patientAddNewDTO);
        String No = patientAddNewDTO.getCardNo();
        int countByNo = patientMapper.countByNo(No);
        if (countByNo>0) {
            String message = "添加就诊人失败，就诊病人名称已被占用！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        Patient patient = new Patient();
        BeanUtils.copyProperties(patientAddNewDTO, patient);
        Timestamp ts = new Timestamp(new Date().getTime());
        patient.setCreateTime(ts);
        patient.setUpdateTime(ts);
        log.debug("即将插入就诊人的数据，参数：{}", patient);
        int rows = patientMapper.insert(patient);
        if (rows != 1) {
            String message = "添加就诊人数据失败，服务器忙，请稍后尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    public void delete(Long id) {
        log.debug("开始处理【删除就诊人数据】的业务，参数：{}",id);
        PatientStandardVO patientStandardVO = patientMapper.getStandardById(id);
        if (patientStandardVO == null){
            String message = "删除就诊人数据失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        log.debug("即将删除就诊人数据，参数：{}",id);
        int rows = patientMapper.deleteById(id);
        if (rows != 1){
            String message = "删除就诊人数据失败，服务器忙，请稍后尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_DELETE,message);
        }
    }

    @Override
    public void updateInfoById(Long id, PatientUpdateDTO patientUpdateDTO) {
        log.debug("开始处理【修改就诊人数据】的业务，id = {}，新的数据={}",id,patientUpdateDTO);
        PatientStandardVO patientStandardById = patientMapper.getStandardById(id);
        if (patientStandardById == null){
            String message = "修改就诊人数据失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }

        Patient patient=new Patient();
        BeanUtils.copyProperties(patientUpdateDTO,patient);
        patient.setId(id);
        log.debug("即将修改就诊人数据，参数：{}",patient);
        int rows = patientMapper.update(patient);
        if (rows != 1){
            String message = "修改就诊人数据失败，服务器忙，请稍后尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE,message);
        }
    }

    @Override
    public PatientStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查找就诊人数据】的业务，参数：{}",id);
        PatientStandardVO patientStandardVO = patientMapper.getStandardById(id);
        if (patientStandardVO == null){
            String message = "查找就诊人数据失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }
        log.debug("即将返回查询结果：{}",patientStandardVO);
        return patientStandardVO;
    }

    @Override
    public PageInfo<PatientListItemVO> list(Integer page, Integer pageSize) {
        PageHelper.startPage(page,pageSize);
        log.debug("开始处理【查询就诊人数据列表】的业务，参数：无");
        List<PatientListItemVO> patientList = patientMapper.list();
        log.debug("即将返回查询结果：{}",patientList);
        return new PageInfo<>(patientList);
    }
}
